/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package co.com.claro.administracionSolicitudes.beans;

import co.com.claro.administracionSolicitudes.dao.exceptions.ClaroException;
import co.com.claro.administracionSolicitudes.db.EJBDatabaseSolicitudesLocal;
import co.com.claro.administracionSolicitudes.entity.TipoEmpleado;
import co.com.claro.administracionSolicitudes.entity.enums.EstadoActividadEnum;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

/**
 *
 * @author Mike
 */
@ManagedBean
@ViewScoped
public class CrearTipoEmpleadoBean {

    @EJB
    private EJBDatabaseSolicitudesLocal localDatabase;
    @ManagedProperty(value="#{usuarioSessionBean}")
    private UsuarioSessionBean sesionBean;
                                                                        /**String que almacena el nombre del tipo de empleado */
    private String nombreTipoEmpleado;                                  /**Listado de los tipos de empleado almacenados en base de datos */
    private List<TipoEmpleado> tipoEmpelados;                           /**Objeto del datatable seleccionado por el usuario */
    private TipoEmpleado tipoEmpleadoSeleccionado;                      /** Variable que contiene el mensaje de error o confirmación de la acción realizada por el usuario */
    private String mensaje;
    
    /**
     * Creates a new instance of CrearTipoEmpleadoBean
     */
    public CrearTipoEmpleadoBean() {
    }
    
    @PostConstruct
    public void inicializarValores(){
        obtenerTipoEmpleados();
    }

    //************************** EVENTOS PROPIOS DEL BEAN ****************************
    
    /**
     * Método encargado de enviar el objeto al EJB para que persista la entidad en base de datos
     */
    public void crearTipoEmpleado(){
        if(isCamposInvalidos()){
            return;
        }
        
        TipoEmpleado tipo = new TipoEmpleado();
        tipo.setNombre(nombreTipoEmpleado);
        tipo.setActivo(EstadoActividadEnum.ACTIVO.getId());
        tipo.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.crearTipoEmpleado(tipo);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearTipoEmpleadoBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerTipoEmpleados();
        borrarCampos();
    }
    
    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void modificarTipoEmpleado(ActionEvent event) throws ClaroException{  
        if(isCamposInvalidos()){
            return;
        }
        
        tipoEmpleadoSeleccionado.setNombre(nombreTipoEmpleado);
        tipoEmpleadoSeleccionado.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.modificarTipoEmpleado(tipoEmpleadoSeleccionado);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearAplicacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerTipoEmpleados();
        borrarCampos();
    }
    
    /**
     * Método que envía el objeto al EJB para que se persista en base de datos
     */
    public void eliminarTipoEmpleado(ActionEvent event){   
        tipoEmpleadoSeleccionado = obtenerObjeto(event);
        
        tipoEmpleadoSeleccionado.setUsuario(sesionBean.getUsuario().getUsername());
        try {
            localDatabase.borradoLogicoTipoEmpleado(tipoEmpleadoSeleccionado);
            incluirMensaje(ResourceBundle.getBundle("mensajes").getString("cambiosGuardadosOk"));
        } catch (ClaroException ex) {
            Logger.getLogger(CrearAplicacionBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        obtenerTipoEmpleados();
        borrarCampos();
    }
    
    private void obtenerTipoEmpleados() {
        tipoEmpelados = localDatabase.findTipoEmpleadoByEstado(EstadoActividadEnum.ACTIVO.getId());
    }
    
    //************************* MÉTODOS PROPIOS DEL BEAN **********************

    /**
     * Método que obtiene el id del objeto contenido dentro del data table
     * @param ActionEvent, evento para buscar el objeto dentro del contexto
     * @return Object, con el id del objeto
     */
    private TipoEmpleado obtenerObjeto(ActionEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        UIComponent componente = event.getComponent().findComponent("idTipoEmpleadoOutputText");
        Integer id = (Integer) componente.getValueExpression("value").getValue(context.getELContext());
        return tipoEmpelados.get(tipoEmpelados.indexOf(new TipoEmpleado(id)));
    }
    
    /**
     * Método que obtiene el objeto seleccionado por el usuario
     * @param event 
     */
    public void seleccionarTipoEmpleado(ActionEvent event){
        tipoEmpleadoSeleccionado = obtenerObjeto(event);
        
        nombreTipoEmpleado = tipoEmpleadoSeleccionado.getNombre();
    }
    
    /**
     * Método que toma un mensaje enviado y lo pasa al contexto para que sea mostrado
     * en la interfaz gráfica del usuario
     * @param String, mensaje con el error que se desea mostrar.
     */
    private void incluirMensaje(String error) {
//        FacesContext.getCurrentInstance().addMessage(null, 
//            new FacesMessage(FacesMessage.SEVERITY_INFO, error, null));
        mensaje = error;
    }
    
    /**
     * Método que valida todos los campos, incluye el mensaje de error en el contexto
     * y retorna una respuesta dependiendo de los que encuentre en las validaciones
     * @return boolean, indicando si los campos del formulario son correctos o no
     */
    private boolean isCamposInvalidos() {
        if (nombreTipoEmpleado == null || nombreTipoEmpleado.isEmpty()) {
            String error = ResourceBundle.getBundle("errores").getString("errorNombreEmpleado");
            incluirMensaje(error);
            return true;
        }
        return false;
    }
    
     /**
     * Método que borra los campos cuando se han hecho modificaciones
     */
    private void borrarCampos(){
        nombreTipoEmpleado = null;
        tipoEmpleadoSeleccionado = null;
    }
    
    //*********************************** GETTERS Y SETTERS *******************************
    
    public String getNombreTipoEmpleado() {
        return nombreTipoEmpleado;
    }

    public void setNombreTipoEmpleado(String nombreTipoEmpleado) {
        this.nombreTipoEmpleado = nombreTipoEmpleado;
    }

    public List<TipoEmpleado> getTipoEmpelados() {
        return tipoEmpelados;
    }

    public void setTipoEmpelados(List<TipoEmpleado> tipoEmpelados) {
        this.tipoEmpelados = tipoEmpelados;
    }

    public UsuarioSessionBean getSesionBean() {
        return sesionBean;
    }

    public void setSesionBean(UsuarioSessionBean sesionBean) {
        this.sesionBean = sesionBean;
    }

    public String getMensaje() {
        return mensaje;
    }

    public void setMensaje(String mensaje) {
        this.mensaje = mensaje;
    }

}
